package thread;

import java.util.Hashtable;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Author: hmm
 * @Created: 2019/11/5
 * @Description: 线程池 多线程测试
 * 1、corePoolSize 如果为0 新加入的线程会放入队列 然后检查线程状态 如果创建线程成功 队列中的线程排队执行
 * 此时 如果队列中可以放下所有线程 那么 只会有一个线程 让所有队列排队执行
 * 如果队列满了 那么判断maximumPoolSize 如果当前线程数 小于maximumPoolSize 那么会创建新的线程
 * 如果线程数>=maximumPoolSize 那么会触发reject策略
 * <p>
 * 2、corePoolSize 如果大于0 新加入线程时会判断 当前线程数量 如果小于corePoolSize 那么会创建新的线程
 * 如果线程数量大于corePoolSize 那么会将线程放入队列 排队由核心线程执行
 * 如果队列满了  那么会判断maximumPoolSize的值 决定是新建线程  还是出发reject策略
 * @Modified by:
 */
public class ThreadPoolDemo {
    private static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(2, 2, 2, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(),
            Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());


    private volatile int a = 0;


    public static void main(String[] args) {
        new ThreadPoolDemo().test();
    }

    public void test() {
        System.out.println("我是主线程开始执行");
        Hashtable<String, Object> table = new Hashtable<>();
        String[] arr = new String[]{"a", "b", "c", "d", "e", "f"};
        for (String str : arr) {
            poolExecutor.execute(new ForThread(poolExecutor, str, table, a));
        }

    }
}
